package br.urca.controller;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.controller.IndexController;
import br.com.caelum.vraptor.validator.Severity;
import br.com.caelum.vraptor.validator.SimpleMessage;
import br.com.caelum.vraptor.validator.Validator;
import br.urca.dao.AlunosCursoDAO;
import br.urca.dao.FuncionarioDAO;
import br.urca.interceptor.InterceptResource;
import br.urca.interceptor.NoInterceptMethod;
import br.urca.model.AlunoCurso;
import br.urca.model.Funcionario;
import br.urca.session.UsuarioLogado;
import br.urca.util.Criptografia;

@Controller
@InterceptResource
public class LoginController {
	
	private AlunosCursoDAO mAlunoCursoDAO;
	private FuncionarioDAO mFuncionarioDAO;
	
	private UsuarioLogado mLogado;
	private Result result;
	private Validator validator;
	private HttpServletRequest request;
	
	@Deprecated LoginController() {}

	@Inject
	public LoginController(HttpServletRequest request,
			AlunosCursoDAO mAlunoCursoDAO, FuncionarioDAO mFuncionarioDAO,
			UsuarioLogado mLogado, Result result, Validator validator) {
		super();
		this.mLogado = mLogado;
		this.result = result;
		this.validator = validator;
		this.request = request;
		this.mAlunoCursoDAO = mAlunoCursoDAO;
		this.mFuncionarioDAO = mFuncionarioDAO;
	}
	
	@NoInterceptMethod
	@Get("/login")	
	public void index() {
		if (mLogado.isLogado() && request.getSession().getAttribute("funcionario") != null) {
			result.redirectTo(IndexController.class).index();
		}
	}
	
	@NoInterceptMethod
	@Post("/login")
	public void login(String login, String senha) {			
		
		if (!mLogado.isLogado()) {
			validator.onErrorRedirectTo(this).index();
			
			validator.addIf((login == null) || (senha == null) ||
					(login.equalsIgnoreCase("")) || (senha.equalsIgnoreCase("")),
					new SimpleMessage("Erro", "Campo de login ou senha não preenchido!"));
			
			Funcionario funcionario = null;
			AlunoCurso aluno = null;
			
			login = removeMascara(login);
			if (login.length() == 11) {
				aluno = mAlunoCursoDAO.buscaDadosAluno(login, senha);
				validator.ensure(aluno != null, 
						new SimpleMessage("Erro",
								"Login ou senha inválida.", Severity.ERROR));
			} else if (login.length() == 8) {
				funcionario = mFuncionarioDAO.buscarPorMatricula(removeMascara(login));
				if (funcionario != null) {
					if ((funcionario.getSenhaMD5() == null) || 
							(!funcionario.getSenhaMD5().equalsIgnoreCase(Criptografia.criptografarMD5(senha)))) {
						funcionario = null;
					}
				}
				validator.ensure(funcionario != null, 
						new SimpleMessage("Erro",
								"Login ou senha inválida.", Severity.ERROR));
			}
			validator.onErrorRedirectTo(this).index();
			
			if (aluno != null) {
				request.getSession().setAttribute("funcionario", aluno.getAluno().getNome());
				mLogado.loga(aluno);
			} else if (funcionario != null) {
				request.getSession().setAttribute("funcionario", funcionario.getNome());
				mLogado.loga(funcionario);
			}
			
			// ou a página inicial
		}
		result.include("login",login).redirectTo(IndexController.class).index();
	}
	
	private String removeMascara(String login) {
		if (login != null)
			return login.replaceAll("-", "");
		else
			return "";
	}
	
	@NoInterceptMethod
	@Get("/logout")
	public void logout() {
		mLogado.logout();
		this.request.removeAttribute("funcionario");
		if (this.request.getSession() != null)
			this.request.getSession().invalidate();
		result.redirectTo(this).index();
	}
	
}
